package com.pfzy.eventbusdemo

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.annotation.Nullable
import androidx.appcompat.app.AppCompatActivity
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode

/**
 * 总线框架 event bus
 *
 * 在Activity中 在onCreate中注册，在onDestory中反注册
 *
 * 在Fragment中 在onCreate中注册，在onDestory中反注册
 * 在Fragment中 在onCreateView中注册，在onDestoryView中反注册
 *
 * 在自定义控件中 在onAttachedToWindow中注册，在onDetachedFromWindow中反注册
 *
 * 普通类 在类中创建注册方法和反注册方法，在合适的时机调用
 */
class SubscriberActivity : AppCompatActivity() {
    private var mObject: MyObject? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 注册事件总线
        EventBus.getDefault().register(this)

        val intent = Intent(this, MyService::class.java)
        startService(intent)
        mObject = MyObject()
        mObject?.registerEventBus()
    }

    override fun onDestroy() {
        super.onDestroy()
        // 反注册事件总线
        EventBus.getDefault().unregister(this)
        mObject?.unRegisterEventBus()
    }

    /**
     * 监听事件 POSTING线程模型：在哪个线程发布事件，就在哪个线程执行onPostingEvent方法
     * 接收消息2
     */
    @Subscribe(threadMode = ThreadMode.POSTING)
    fun onPostingEvent(event: MyEvent?) {
        Log.d(TAG, "onPostingEvent:" + Thread.currentThread().name)
    }

    /**
     * MAIN线程模型：不管是哪个线程发布事件，都在主线程执行onMainEvent方法
     * 接收消息1
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onMainEvent(event: MyEvent?) {
        Log.d(TAG, "onMainEvent: " + Thread.currentThread().name)
    }

    /**
     * BACKGROUND线程模型：事件如果是在子线程发布，onBackgroundEvent方法就在该子线程执行，事件如果是在
     * 主线程中发布，onBackgroundEvent方法就在EventBus内部的线程池中执行
     */
    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    fun onBackgroundEvent(event: MyEvent?) {
        Log.d(TAG, "onBackgroundEvent: " + Thread.currentThread().name)
    }

    /**
     * ASYNC线程模型：不管事件在哪个线程发布，onAsyncEvent方法都在EventBus内部的线程池中执行
     */
    @Subscribe(threadMode = ThreadMode.ASYNC)
    fun onAsyncEvent(event: MyEvent?) {
        Log.d(TAG, "onAsyncEvent: " + Thread.currentThread().name)
    }

    /**
     * 启动PublisherActivity
     */
    fun onStartPublisherActivity(view: View?) {
        val intent = Intent(this, PublisherActivity::class.java)
        startActivity(intent)
    }

    /**
     * 发送 StickyEvent
     */
    fun onPublishStickyEvent(view: View?) {
        EventBus.getDefault().postSticky(MyStickyEvent())
    }

    /**
     * 启动StickyActivity
     */
    fun onStartStickyEvent(view: View?) {
        val intent = Intent(this, StickyActivity::class.java)
        startActivity(intent)
    }

    companion object {
        private const val TAG = "SubscriberActivity"
    }
}
